﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using IndignadoFramework.BackOffice.Models;
using IndignadoFramework.BackBone.Model;
using IndignadoFramework.BackBone.InternalServices;
using IndignadoFramework.BackBone.InternalServices.Implementacion;
using System.IO;

namespace IndignadoFramework.BackOffice.Controllers
{
    public class MovimientoController : Controller
    {
        private MovimientoServices _movimientos;
        private OrigenDeDatosServices _origenDeDatos;

        public MovimientoController()
            : this(new MovimientoServicesImpl())
        {
            _origenDeDatos = new OrigenDeDatosServicesImpl();
        }

        public MovimientoController(MovimientoServices moves)
        {
            _movimientos = moves;

        }

        //
        // GET: /Movimiento/
        [Authorize]
        [HttpGet]
        public ActionResult NuevoMovimiento()
        {
            return View();
        }

        //
        // POST: /Account/NuevoMovimiento
        [Authorize]
        [HttpPost]
        public ActionResult NuevoMovimiento(MovimientoModel model)
        {
            if (ModelState.IsValid)
            {
                string mimeType = Request.Files["MovimientoLogo"].ContentType;
                Stream fileStream = Request.Files["MovimientoLogo"].InputStream;
                int fileLength = Request.Files["MovimientoLogo"].ContentLength;
                byte[] logo = new byte[fileLength];
                fileStream.Read(logo, 0, fileLength);

                mimeType = Request.Files["MovimientoEstiloCSS"].ContentType;
                fileStream = Request.Files["MovimientoEstiloCSS"].InputStream;
                fileLength = Request.Files["MovimientoEstiloCSS"].ContentLength;
                byte[] estiloCSS = new byte[fileLength];
                fileStream.Read(estiloCSS, 0, fileLength);


                MovementModel mov = new MovementModel();

                mov.MovimientoNombre = model.MovimientoNombre;
                mov.MovimientoUbicacionX = model.MovimientoUbicacionX;
                mov.MovimientoUbicacionY = model.MovimientoUbicacionY;
                mov.MovimientoDescripcion = model.MovimientoDescripcion;
                mov.MovimientoLogo = logo;
                mov.MovimientoEstiloCSS = estiloCSS;
                mov.MovimientoConstM = model.MovimientoConstM;
                mov.MovimientoConstN = model.MovimientoConstN;
                mov.MovimientoConstX = model.MovimientoConstX;
                mov.MovimientoConstZ = model.MovimientoConstZ;
                mov.MovimientoHost = model.MovimientoHost + ".happyclone.com";

                int movimientoId = _movimientos.addMovimiento(mov);

                int maxCategorias = Convert.ToInt32(Request.Form["cantidadCategoriaTematica"]);
                List<string> listaCategoriaTematica = new List<string>();

                for (int i = 1; i <= maxCategorias; i++)
                {
                    string IdCategoria = "categoria" + i.ToString();
                    if (Request.Form[IdCategoria] != null)
                    {
                        listaCategoriaTematica.Add(Request.Form[IdCategoria]);
                    }
                }

                _movimientos.addCategoriaTematica(movimientoId, listaCategoriaTematica);

                // Cargo la Galería de Imagenes
                int maxImagenes = Convert.ToInt32(Request.Form["cantidadimagenes"]);
                List<ImagenGaleriaModel> listaImagenes = new List<ImagenGaleriaModel>();
                for (int i = 1; i <= maxImagenes; i++)
                {
                    string IdImagen = "imagen" + i.ToString();
                    if (Request.Files[IdImagen] != null)
                    {
                        fileStream = Request.Files[IdImagen].InputStream;
                        fileLength = Request.Files[IdImagen].ContentLength;
                        mimeType = Request.Files[IdImagen].ContentType;
                        byte[] imgsource = new byte[fileLength];
                        fileStream.Read(imgsource, 0, fileLength);

                        ImagenGaleriaModel imagen = new ImagenGaleriaModel();
                        imagen.ImagenData = imgsource;
                        imagen.ImagenFormato = mimeType;
                        listaImagenes.Add(imagen);
                    }
                }
                //agrego la galeria de imagenes al movimiento
                _movimientos.addGaleriaImagenes(movimientoId, listaImagenes);

                // Cargo los Origene de Datos
                int maxOrigenes = Convert.ToInt32(Request.Form["cantidadOrigenes"]);
                List<byte[]> listaOrigenes = new List<byte[]>();
                for (int i = 1; i <= maxOrigenes; i++)
                {
                    //string a = Request.Form["inputurl"+i];
                    if (Request.Form["inputurl" + i] != null)
                    {
                        OrigenDeDatosModel origen = new OrigenDeDatosModel();
                        origen.OrigenDeDatoNombre = Request.Form["inputnombre" + i];
                        switch (Request.Form["tipo" + i])
                        {
                            case "1":
                                origen.OrigenDeDatoTipo = "RSS";
                                break;
                            case "2":
                                origen.OrigenDeDatoTipo = "Dinamico";
                                break;
                        }
                        origen.OrigenDeDatoUrl = Request.Form["inputurl" + i];

                        mimeType = Request.Files["inputdll" + i].ContentType;
                        fileStream = Request.Files["inputdll" + i].InputStream;
                        fileLength = Request.Files["inputdll" + i].ContentLength;
                        if (fileLength == 0)
                        {
                            // si le pongo null el automapper me tira una excepcion 
                            origen.OrigenDeDatoDLL = new byte[1];
                        }
                        else
                        {
                            byte[] dll = new byte[fileLength];
                            fileStream.Read(dll, 0, fileLength);
                            origen.OrigenDeDatoDLL = dll;
                        }
                        // le pongo un byte 
                        origen.OrigenDeDatoData = "";
                        List<FiltroModel> filtros = new List<FiltroModel>();

                        int maxFiltros = Convert.ToInt32(Request.Form["cantidadFiltros" + i]);

                        for (int j = 1; j <= maxFiltros; j++)
                        {
                            if ((Request.Form["filtroinputnombre" + i + '-' + j] != null) && (Request.Form["filtroinputvalor" + i + '-' + j] != null))
                            {
                                FiltroModel filtro = new FiltroModel();
                                filtro.FiltroNombre = Request.Form["filtroinputnombre" + i + '-' + j];
                                filtro.FiltroValor = Request.Form["filtroinputvalor" + i + '-' + j];

                                filtros.Add(filtro);
                            }
                        }
                        // Agrego los filtros al origen
                        origen.setFiltros(filtros);
                        // lo persisto en la base
                        _origenDeDatos.crearOrigenDeDatos(movimientoId, origen);
                    }
                }
                return RedirectToAction("ListarMovimientos", "Movimiento");
            }
            return View(model);
        }

        //
        // GET: /Movimiento/ListarMovimientos
        [Authorize]
        public ActionResult ListarMovimientos()
        {

            List<MovementModel> movimientos = _movimientos.getMovimientos();
            List<FilaMovimiento> listaMovimientos = new List<FilaMovimiento>();
            foreach (MovementModel mov in movimientos)
            {
                FilaMovimiento filaMov = new FilaMovimiento();
                filaMov.Id = mov.Id;
                filaMov.MovimientoNombre = mov.MovimientoNombre;
                filaMov.MovimientoDescripcion = mov.MovimientoDescripcion;
                listaMovimientos.Add(filaMov);
            }
            return View(listaMovimientos);
        }

        //
        // GET: /Movimiento/ModificarMovimiento
        [Authorize]
        [HttpGet]
        public ActionResult ModificarMovimiento(int movimientoId)
        {
            MovementModel movimiento = _movimientos.getMovimiento(movimientoId);
            MovimientoModel model = new MovimientoModel();
            AutoMapper.Mapper.CreateMap<MovementModel, MovimientoModel>();
            model = AutoMapper.Mapper.Map(movimiento, model);
            return View(model);
        }

        //
        // POST: /Movimiento/ModificarMovimiento
        [Authorize]
        [HttpPost]
        public ActionResult ModificarMovimiento(MovimientoModel model)
        {
            string mimeType = Request.Files["MovimientoLogo"].ContentType;
            Stream fileStream = Request.Files["MovimientoLogo"].InputStream;
            int fileLength = Request.Files["MovimientoLogo"].ContentLength;
            byte[] logo = new byte[fileLength];
            fileStream.Read(logo, 0, fileLength);

            mimeType = Request.Files["MovimientoEstiloCSS"].ContentType;
            fileStream = Request.Files["MovimientoEstiloCSS"].InputStream;
            fileLength = Request.Files["MovimientoEstiloCSS"].ContentLength;
            byte[] estiloCSS = new byte[fileLength];
            fileStream.Read(estiloCSS, 0, fileLength);


            MovementModel mov = new MovementModel();
            mov.Id = model.Id;
            mov.MovimientoNombre = model.MovimientoNombre;
            mov.MovimientoUbicacionX = model.MovimientoUbicacionX;
            mov.MovimientoUbicacionY = model.MovimientoUbicacionY;
            mov.MovimientoDescripcion = model.MovimientoDescripcion;
            if (logo.Length != 0)
                mov.MovimientoLogo = logo;
            else
                mov.MovimientoLogo = null;
            if (estiloCSS.Length != 0)
                mov.MovimientoEstiloCSS = estiloCSS;
            else
                mov.MovimientoEstiloCSS = null;
            mov.MovimientoConstM = model.MovimientoConstM;
            mov.MovimientoConstN = model.MovimientoConstN;
            mov.MovimientoConstX = model.MovimientoConstX;
            mov.MovimientoConstZ = model.MovimientoConstZ;
            mov.MovimientoHost = model.MovimientoHost;
            bool resultado = _movimientos.modificarMovimiento(mov);
            if (resultado == true)
            {
                int movimientoId = mov.Id;

                // cargo Categorias Tematicas
                int maxCategorias = Convert.ToInt32(Request.Form["cantidadCategoriaTematica"]);
                List<string> listaCategoriaTematica = new List<string>();

                for (int i = 1; i <= maxCategorias; i++)
                {
                    string IdCategoria = "categoria" + i.ToString();
                    if (Request.Form[IdCategoria] != null)
                    {
                        listaCategoriaTematica.Add(Request.Form[IdCategoria]);
                    }
                }

                _movimientos.addCategoriaTematica(movimientoId, listaCategoriaTematica);

                // Cargo la Galería de Imagenes
                int maxImagenes = Convert.ToInt32(Request.Form["cantidadimagenes"]);
                List<ImagenGaleriaModel> listaImagenes = new List<ImagenGaleriaModel>();
                for (int i = 1; i <= maxImagenes; i++)
                {
                    string IdImagen = "imagen" + i.ToString();
                    if (Request.Files[IdImagen] != null)
                    {
                        fileStream = Request.Files[IdImagen].InputStream;
                        fileLength = Request.Files[IdImagen].ContentLength;
                        mimeType = Request.Files[IdImagen].ContentType;
                        byte[] imgsource = new byte[fileLength];
                        fileStream.Read(imgsource, 0, fileLength);

                        ImagenGaleriaModel imagen = new ImagenGaleriaModel();
                        imagen.ImagenData = imgsource;
                        imagen.ImagenFormato = mimeType;
                        listaImagenes.Add(imagen);
                    }
                }
                //agrego la galeria de imagenes al movimiento
                _movimientos.addGaleriaImagenes(movimientoId, listaImagenes);

                // Cargo los Origene de Datos
                int maxOrigenes = Convert.ToInt32(Request.Form["cantidadOrigenes"]);
                List<byte[]> listaOrigenes = new List<byte[]>();
                for (int i = 1; i <= maxOrigenes; i++)
                {
                    //string a = Request.Form["inputurl"+i];
                    if (Request.Form["inputurl" + i] != null)
                    {
                        OrigenDeDatosModel origen = new OrigenDeDatosModel();
                        origen.OrigenDeDatoNombre = Request.Form["inputnombre" + i];
                        switch (Request.Form["tipo" + i])
                        {
                            case "1":
                                origen.OrigenDeDatoTipo = "RSS";
                                break;
                            case "2":
                                origen.OrigenDeDatoTipo = "Dinamico";
                                break;
                        }
                        origen.OrigenDeDatoUrl = Request.Form["inputurl" + i];

                        fileStream = Request.Files["inputdll" + i].InputStream;
                        fileLength = Request.Files["inputdll" + i].ContentLength;
                        if (fileLength == 0)
                        {
                            // si le pongo null el automapper me tira una excepcion 
                            origen.OrigenDeDatoDLL = new byte[1];
                        }
                        else
                        {
                            byte[] dll = new byte[fileLength];
                            fileStream.Read(dll, 0, fileLength);
                            origen.OrigenDeDatoDLL = dll;
                        }
                        origen.OrigenDeDatoData = "";
                        List<FiltroModel> filtros = new List<FiltroModel>();

                        int maxFiltros = Convert.ToInt32(Request.Form["cantidadFiltros" + i]);

                        for (int j = 1; j <= maxFiltros; j++)
                        {
                            if ((Request.Form["filtroinputnombre" + i + '-' + j] != null) && (Request.Form["filtroinputvalor" + i + '-' + j] != null))
                            {
                                FiltroModel filtro = new FiltroModel();
                                filtro.FiltroNombre = Request.Form["filtroinputnombre" + i + '-' + j];
                                filtro.FiltroValor = Request.Form["filtroinputvalor" + i + '-' + j];

                                filtros.Add(filtro);
                            }
                        }
                        // Agrego los filtros al origen
                        origen.setFiltros(filtros);
                        // lo persisto en la base
                        _origenDeDatos.crearOrigenDeDatos(movimientoId, origen);
                    }
                }
                return RedirectToAction("ListarMovimientos", "Movimiento");
            }
            else
            {
                return RedirectToAction(
                    "ModificarMovimiento",                // Action name
                    "Movimiento",  // Controller name
                    new { movimientoId = model.Id }      // Route values
                );
            }
        }

    }
}